home *** CD-ROM | disk | FTP | other *** search
- // The Y2K Fix Hack by Mark Darling
- // Use this only as a dare - it hasn't been well tested. I won't be responsible for
- // anything that goes wrong.
-
- #include <Types.h>
- #include <Memory.h>
- #include <A4Stuff.h>
- #include <SetUpA4.h>
- #include <Quickdraw.h>
- #include <LowMem.h>
- #include <Errors.h>
- #include <Gestalt.h>
- #include <Resources.h>
- #include <Events.h>
- #include <Windows.h>
- #include <Retrace.h>
- #include <Lowmem.h>
- #include <MixedMode.h>
-
- #define FALSE false
- #define TRUE true
- #define NIL 0L
-
-
- #define kInitRezType 'INIT'
- #define kInitRezID 300
-
- #define kMinSystemVersion (0x0603)
-
-
- // ShowInit
- #define kOkMac 128
-
-
- struct NInitGlobals
- {
- SysEnvRec gSystemInfo;
- long gInfo; // 1=68k,2=PPC
- VBLTask gVBLTask;
- unsigned long gOffset;
- unsigned long gDelay;
- };
- typedef struct NInitGlobals NInitGlobals;
-
- NInitGlobals *gP;
-
- OSErr DoInstall( void);
- pascal void DoVBL(void);
-
-
- extern void ShowIconFamilyAnim(short iconId, short cnt);
- extern void ShowIconFamily(short iconId);
-
- void main( void )
- {
- long oldA4;
- Handle initH = nil; /* Handle to our own INIT resource */
- OSErr err = noErr;
-
- oldA4 = SetCurrentA4(); /* Get the proper value of A4 into A4 */
- RememberA4(); /* save into self-modifying code */
-
- gP = (NInitGlobals*) NewPtrSysClear( sizeof(NInitGlobals));
- if ( !gP ) {
- err = memFullErr;
- goto DONE;
- }
-
- err = SysEnvirons( 1, &gP->gSystemInfo );
- if ( err )
- goto DONE;
- if ( gP->gSystemInfo.systemVersion < kMinSystemVersion ) {
- err = -1;
- goto DONE;
- }
-
- initH = Get1Resource( kInitRezType, kInitRezID );
- if ( !initH ) {
- err = resNotFound;
- goto DONE;
- }
-
- err = Gestalt( gestaltSysArchitecture, &gP->gInfo );
- if ( err) gP->gInfo = gestalt68k;
-
- err = DoInstall();
-
- DONE:
- if ( err ) {
- if ( gP )
- DisposePtr( (Ptr)gP );
- } else {
- ShowIconFamilyAnim( kOkMac, 1 );
- DetachResource( initH);
- MoveHHi( (Handle)initH); HLock( (Handle)initH);
- }
-
- RestoreA4( oldA4 ); /* restore previous value of A4 */
- }
-
- #define kVBLStartInterval 50 // Ticks???
-
- OSErr DoInstall( void )
- {
- long oldA4;
- NInitGlobals *locGPtr;
-
- oldA4 = SetUpA4();
- locGPtr = gP;
- RestoreA4( oldA4 );
-
- locGPtr->gVBLTask.qLink = 0;
- locGPtr->gVBLTask.qType = vType;
- locGPtr->gVBLTask.vblAddr = DoVBL;
- locGPtr->gVBLTask.vblCount = kVBLStartInterval;
- locGPtr->gVBLTask.vblPhase = 0;
-
- VInstall( (QElemPtr)&locGPtr->gVBLTask);
-
- gP->gOffset = 0;
-
- return noErr;
- }
-
- VBLTask *GetVBLInfo( void ) = { 0x2008 }; /* MOVE.L A0,D0 */
-
- #define kY2K_Ticks 0xB492F3FF
-
- pascal void DoVBL(void)
- {
- VBLTask *curVBLInfo;
- unsigned long cmpT;
-
- curVBLInfo = GetVBLInfo();
-
- curVBLInfo->vblCount = kVBLStartInterval;
-
- cmpT = kY2K_Ticks - *(unsigned long*)0x20C;
-
- // If we have passed the Y2K point, reset the time to 1900.
- if ( cmpT <= 0 )
- {
- *(unsigned long*)0x20C = kY2K_Ticks - 60;
- }
-
- return;
- }
-